home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Speccy ClassiX 1998
/
Speccy ClassiX 98.iso
/
amiga_system
/
the_aminet
/
dev
/
gcc
/
ixemulsrc.lha
/
ixemul-41.4
/
gnulib
/
gbl-ctors.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-20
|
3KB
|
90 lines
/* Definitions relating to the special __do_global_init function used
for getting g++ file-scope static objects constructed. This file
wil get included either by gnulib2.c (for systems that don't support
a .init section) or by crtstuff.c (for those that do).
Written by Ron Guilmette (rfg@ncd.com)
Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* This file contains definitions and declarations of things
relating to the normal start-up-time invocation of C++
file-scope static object constructors. These declarations
and definitions are used by *both* gnulib2.c and by crtstuff.c.
Note that this file should only be compiled with GCC.
*/
#ifdef sun
extern void on_exit (void*, void*);
#define ON_EXIT(FUNC,ARG) on_exit ((FUNC), (ARG))
#else
#ifdef HAVE_ATEXIT
extern void atexit (void (*) (void));
#define ON_EXIT(FUNC,ARG) atexit ((FUNC))
#endif
#endif
/* Declare a pointer to void function type. */
typedef void (*func_ptr) (void);
/* Declare the set of symbols use as begin and end markers for the lists
of global object constructors and global object descructors. */
extern func_ptr __CTOR_LIST__[];
extern func_ptr __CTOR_END__[];
extern func_ptr __DTOR_LIST__[];
extern func_ptr __DTOR_END__[];
/* Declare the routine which need to get invoked at program exit time. */
extern void __do_global_dtors ();
/* Define a macro with the code which needs to be executed at program
start-up time. This macro is used in two places in crtstuff.c (for
systems which support a .init section) and in one place in gnulib2.c
(for those system which do *not* support a .init section). For all
three places where this code might appear, it must be identical, so
we define it once here as a macro to avoid various instances getting
out-of-sync with one another. */
/* There are two formats for the table __CTOR_LIST__:
GNU ld: first word is number of pointers, followed by that many pointers.
ELF/COFF: first word is -1, followed by pointers up to __CTOR_END__. */
#define DO_GLOBAL_CTORS_BODY \
do { \
int nptrs = *(int *)__CTOR_LIST__; \
ON_EXIT (__do_global_dtors, 0); \
if (nptrs != -1) \
{ \
int i; \
for (i = 1; i <= nptrs; i++) \
__CTOR_LIST__[i] (); \
} \
else \
{ \
func_ptr *p; \
for (p = __CTOR_LIST__ + 1; p < __CTOR_END__; ) \
(*p++) (); \
} \
} while (0)